/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-24                  the first version
 */

#include "BspHelper.h"
#include <rthw.h>
#include <rtthread.h>

// 设置串口3为调试串口
#define DEBUG_USARTx (CM_USART3)


/* 消息队列控制块 */
struct rt_messagequeue debug_usart_mq;
/* 消息队列中用到的放置消息的内存池 */
rt_uint8_t debug_usart_msg_pool[16384];
char debug_usart_tx_buf[1024];
// 创建控制台接收缓冲区
/* 消息队列控制块 */
//struct rt_messagequeue finsh_usart_mq;
/* 消息队列中用到的放置消息的内存池 */
//rt_uint8_t finsh_usart_msg_pool[16];

/* 北斗消息 */

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
 * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
 * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
 */
#define RT_HEAP_SIZE (15 * 1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void) {
  return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void) {
  return rt_heap + RT_HEAP_SIZE;
}
#endif

// 这个函数被临时移动到ClkInitHelper中，跟随SysTick_Handler一起使用。此tick时钟中断函数也在这个文件中被定义
//void rt_os_tick_callback(void)
//{
//    rt_interrupt_enter();
//
//    rt_tick_increase();

//    rt_interrupt_leave();
//}

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void) {
  //#error "TODO 1: OS Tick Configuration."
  /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */

  /* Call components board initial (use INIT_BOARD_EXPORT()) */
  Bsp_Init();

  rt_mq_init(&debug_usart_mq,
             "debug_usart_msg",
             &debug_usart_msg_pool[0],      /* 内存池指向 msg_pool */
             1024,              /* 每个消息的大小是 1 字节 */
             16384,  /* 内存池的大小是 msg_pool 的大小 */
             RT_IPC_FLAG_PRIO); /* 如果有多个线程等待，优先级大小的方法分配消息 */
  SWDT_FeedDog();
	
  // 初始化网卡PHY芯片
  
  GPIO_ResetPins(ETH_RST1_PORT, ETH_RST1_PIN);
  DDL_DelayMS(10U);
  GPIO_SetPins(ETH_RST1_PORT, ETH_RST1_PIN);
  
	
//	rt_mq_init(&finsh_usart_mq,
//             "finsh_usart_msg",
//             &finsh_usart_msg_pool[0],      /* 内存池指向 msg_pool */
//             1,              /* 每个消息的大小是 1 字节 */
//             sizeof(finsh_usart_msg_pool),  /* 内存池的大小是 msg_pool 的大小 */
//             RT_IPC_FLAG_PRIO); /* 如果有多个线程等待，优先级大小的方法分配消息 */

  rt_kprintf("init board successful!");
  
  // 读取系统复位状态
  {
    rt_kprintf("rmu reg: 0x%08X\n", CM_RMU->RSTF0);
    if (SET == RMU_GetStatus(RMU_FLAG_SW)) {
      rt_kprintf("reset by flasg sw\n");
    }else if (SET == RMU_GetStatus(RMU_FLAG_SWDT)) {
		rt_kprintf("reset by wdg\n");
		rt_kprintf("看门狗重启\n");
	}
  }
  /* Clear reset cause */
  LL_PERIPH_WE(LL_PERIPH_PWC_CLK_RMU);
  RMU_ClearStatus();
  LL_PERIPH_WP(LL_PERIPH_PWC_CLK_RMU);
  // 读取系统复位状态
#ifdef RT_USING_COMPONENTS_INIT
  rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

// uart_init需要自己手动初始化。可以用上面rt_hw_board_init调用。也可以用INIT_BOARD_EXPORT()自动初始化。
// 不过这里初始化内容在BspInit中已经初始化了。这里不再进行初始化了。
//static int uart_init(void) {
//  //#error "TODO 2: Enable the hardware uart and config baudrate."
//  return 0;
//}
//INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str) {
  //#error "TODO 3: Output the string 'str' through the uart."

  rt_enter_critical();
  {// 消息队列方式发送
	//led_busy_times = 4;
    rt_mq_send_wait(&debug_usart_mq, str, 1024, 500);
  }// 消息队列方式发送
  rt_exit_critical();
}

#endif
